package com.pe.pgn.clubpgn.webapp.controller.periodoacumulacion;


import java.util.Calendar;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.joda.time.format.DateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.i18n.LocaleContextHolder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.support.SessionStatus;

import com.pe.pgn.clubpgn.common.CLPConstantes;
import com.pe.pgn.clubpgn.domain.ClpbPrograma;
import com.pe.pgn.clubpgn.domain.ClprPeriodoAcumulacion;

import com.pe.pgn.clubpgn.service.PeriodoAcumulacionService;
import com.pe.pgn.clubpgn.service.ProgramaService;
import com.pe.pgn.clubpgn.webapp.controller.BaseFormController;
import com.pe.pgn.clubpgn.webapp.util.CalendarUtil;

/**
 * @author Frank
 * */

@Controller
@RequestMapping("/programa/periodoacumulacion/**")
public class PeriodoAcumulacionController extends BaseFormController{

	@Autowired
	private ProgramaService programaService;
	
	@Autowired
	private PeriodoAcumulacionService periodoAcumulacionService;
	
	
	@RequestMapping(value = "/periodoacumulacionform.html")
	public String verPeriodoPrograma(@RequestParam(value = "id", required = false) Long idPrograma, 
			HttpServletRequest request,Model modelMap) {
		
		try {
	
			ClpbPrograma programa = programaService.getProgramaPorID(idPrograma);
			List<ClprPeriodoAcumulacion> listaperiodoacumu=periodoAcumulacionService.obtenerperiodosacumulacion(idPrograma);
					
			
			ClprPeriodoAcumulacion periodoacumulacion= new ClprPeriodoAcumulacion();
			periodoacumulacion.setClpbPrograma(programaService.getProgramaPorID(idPrograma));
			
			modelMap.addAttribute("periodoacumulacion",periodoacumulacion);
			modelMap.addAttribute("listaperiodoacumu", listaperiodoacumu);
	    	modelMap.addAttribute("periodoprograma_date_format", DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale()));
	    	
	    	return "/programa/periodoacumulacion/periodoacumulacionform";
			
		} catch (Exception e) {
			saveError(request, getText("errors.general", request.getLocale()));
			return "/programa/periodoacumulacion/periodoacumulacionform";
		}
	}

	
	@RequestMapping(value = "/eliminarperiodoacumulacion.html")
	public String eliminarPeriodoPrograma(
	@RequestParam(value = "id", required = false) Long id,
	@RequestParam(value = "idPrograma", required = false) Long idPrograma,
			HttpServletRequest request,Model modelMap) {
		
	try{
			ClprPeriodoAcumulacion clprPeriodoAcumulacion = periodoAcumulacionService.findPeriodoProgramaById(id);
			
			Calendar iniAcu 	 = clprPeriodoAcumulacion.getDaFechaInicio();
			Calendar venAcu	 = clprPeriodoAcumulacion.getDaFechaVencimientoPuntos();
			Calendar currentDate = Calendar.getInstance();
				
			if((iniAcu.compareTo(currentDate) < 0 &&
					venAcu.compareTo(currentDate) > 0) ||
		            iniAcu.compareTo(currentDate) == 0 ||
		            venAcu.compareTo(currentDate) == 0 ){
					
				     	
					saveError(request, getText("periodoprogramaform.validacionfechaencurso", request.getLocale()));
					
		   }else if( iniAcu.compareTo(currentDate) < 0 && venAcu.compareTo(currentDate) < 0 ){
		        	 
		        	saveError(request, getText("periodoprogramaform.validacionfechapasada", request.getLocale()));

        }else{
		    periodoAcumulacionService.eliminarPeriodoAcumulacion(id);
			saveMessage(request, getText("periodoprogramaform.deleted", request.getLocale()));
        }
			ClprPeriodoAcumulacion periodoacumulacion = new ClprPeriodoAcumulacion();
    		periodoacumulacion.setClpbPrograma(programaService.getProgramaPorID(idPrograma));
						    	
	    	modelMap.addAttribute("periodoacumulacion",periodoacumulacion);
			modelMap.addAttribute("listaperiodoacumu", periodoAcumulacionService.obtenerperiodosacumulacion(idPrograma));
	    	modelMap.addAttribute("periodoprograma_date_format", DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale()));
			return "/programa/periodoacumulacion/periodoacumulacionform";
	} catch (Exception e) {
		
		saveError(request, getText("errors.general", request.getLocale()));
		return "/programa/periodoprograma/periodoprogramaform";
	}
		
	}
	

	
	@RequestMapping(value = "/periodoacumulacionform.html", method = RequestMethod.POST)
	public String guardarPeriodoPrograma(@ModelAttribute("periodoacumulacion") ClprPeriodoAcumulacion periodoacumulacion,
	BindingResult result, SessionStatus status, HttpServletRequest request,Model modelMap) {
		
		try {
			
			if (result.hasErrors()) {
				return "/programa/periodoacumulacion/periodoacumulacionform";
			}
			
			Long idPrograma = periodoacumulacion.getClpbPrograma().getId();
			ClprPeriodoAcumulacion periodoacumu  = new ClprPeriodoAcumulacion();
			ClpbPrograma clpbprograma = programaService.getProgramaPorID(new Long(idPrograma));			
			periodoacumu.setClpbPrograma(clpbprograma);
			
			modelMap.addAttribute("periodoprograma_date_format", DateTimeFormat.patternForStyle("S-", LocaleContextHolder.getLocale()));
			modelMap.addAttribute("periodoacumulacion"	, periodoacumu);
			modelMap.addAttribute("listaperiodoacumu" 	, periodoAcumulacionService.obtenerperiodosacumulacion(idPrograma));
			
			Calendar fechaInicioAcumu   = null;
			Calendar fechaFinAcumu	  = null;
			Calendar fechaVenci	  = null;
			String desFechaInicioAcumu  = periodoacumulacion.getDesFechaInicio();
			String desFechaFinAcumu     = periodoacumulacion.getDesFechaFin();
			String desFechaVenci    = periodoacumulacion.getDesFechaVencimientoPuntos();
			
				
			try{
				fechaInicioAcumu =
					CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, desFechaInicioAcumu);
			}catch(Exception e){
	        	saveError(request, getText("periodoacumulacionform.novalidafechainicioacumulacion", request.getLocale()));
	        	return "/programa/periodoacumulacion/periodoacumulacionform";
	        }
		
			try{
				fechaFinAcumu = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, desFechaFinAcumu);
			}catch(Exception e){
	        	saveError(request, getText("periodoacumulacionform.novalidafechafinacumulacion", request.getLocale()));
	        	return "/programa/periodoacumulacion/periodoacumulacionform";
	        }
			
			try{
				fechaVenci = CalendarUtil.stringToCalendar(CLPConstantes.DATE_PATTERN, desFechaVenci);
			}catch(Exception e){
	        	saveError(request, getText("periodoacumulacionform.novalidafechafinacumulacion", request.getLocale()));
	        	return "/programa/periodoacumulacion/periodoacumulacionform";
	        }
	
			Date fechaini  = new Date(fechaInicioAcumu.getTimeInMillis());
			Date fechafin  = new Date(fechaFinAcumu.getTimeInMillis());
			Date fechaven  = new Date(fechaVenci.getTimeInMillis());
			
			
			
			periodoacumulacion.setDaFechaInicio(fechaInicioAcumu);
			periodoacumulacion.setDaFechaFin(fechaFinAcumu);
			periodoacumulacion.setDaFechaVencimientoPuntos(fechaVenci);
			
			///////////////////////////////////////////////////////////////////////////////////
	        //las fechas de Acumulacion tienen que estar dentro de las fechas de vigencia
			
	        Calendar daFechaInicioVigencia = clpbprograma.getDaFechaInicioVigencia();
	        Calendar daFechaFinVigencia    = clpbprograma.getDaFechaFinVigencia();
	        

	        
	        
	        if((daFechaInicioVigencia.compareTo(fechaInicioAcumu) > 0) ||
	           (daFechaFinVigencia.compareTo(fechaInicioAcumu)    < 0) ||
	           (daFechaInicioVigencia.compareTo(fechaFinAcumu)    > 0) ||
	           (daFechaFinVigencia.compareTo(fechaFinAcumu)       < 0) ||
	           (daFechaInicioVigencia.compareTo(fechaVenci)    > 0) ||
	           (daFechaFinVigencia.compareTo(fechaVenci)       < 0)
	        ){
	        	
	        	
	        	saveError(request, getText("periodoacumulacionform.validacionfechasacumu", request.getLocale()));
	        	return "/programa/periodoacumulacion/periodoacumulacionform";
	        }
	        
	        if(fechaVenci.compareTo(fechaFinAcumu)<0){
	        	saveError(request, getText("periodoacumulacionform.validacionfechasvencimiento", request.getLocale()));
	        	return "/programa/periodoacumulacion/periodoacumulacionform";
	        }
	        
	  
	        
	        String msgError = periodoAcumulacionService.validarNoTocarPeriodosExistentes
	        (periodoacumulacion,clpbprograma);
	        
	        if(!"".equals(msgError)){
	        	
	        	saveError(request, getText("periodoprogramaform.periodocruzado", request.getLocale()));       	
	        	return "/programa/periodoacumulacion/periodoacumulacionform";
	        }        
	        ///////////////////////////////////////////////////////////////////////////////////
	        
			
			periodoAcumulacionService.saveOrUpdatePeriodoAcumulacion(periodoacumulacion, clpbprograma);
			saveMessage(request, getText("periodoprogramaform.added", request.getLocale()));			
	    	modelMap.addAttribute("listaperiodoacumu" 	, periodoAcumulacionService.obtenerperiodosacumulacion(idPrograma));
	    	
			return "/programa/periodoacumulacion/periodoacumulacionform";
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			saveError(request, getText("errors.general", request.getLocale()));
			return "/programa/periodoacumulacion/periodoacumulacionform";
		}
	}
	
	

	
}
